public class BinaryTree {

    static class TreeNode {
        /**
         * 创建节点内部类*/
        public String val;
        public TreeNode left;
        public TreeNode right;

        public TreeNode(String val) {
            this.val = val;
        }
    }

    // 类变量，用于记录字符串遍历位置
    private int index;

    public TreeNode createTree(String s) {
        /**
         * 封装一层，用于重置index*/
        index = 0;
        return createTreeMode(s);
    }

    public TreeNode createTreeMode(String s) {
        /**
         * 给定树前序遍历顺序，创建一棵树*/
        // 1 递归出口
        if(s.length() == 0 || s.charAt(index) == '#') {
            // 注意步进
            index++;
            return null;
        }

        // 2 创建当前节点，并递归创建左右子树
        TreeNode cur = new TreeNode(String.valueOf(s.charAt(index++)));
        cur.left = createTreeMode(s);
        cur.right = createTreeMode(s);

        // 3 返回节点
        return cur;
    }

    public void preorderTraversal(TreeNode root) {
        /**
         * 前序遍历二叉树*/
        // 1 递归出口
        if(root == null) {
            return;
        }

        // 2 前序遍历打印（根左右）
        System.out.print(root.val + " ");
        preorderTraversal(root.left);
        preorderTraversal(root.right);
    }

    public void inorderTraversal(TreeNode root) {
        /**
         * 中序遍历二叉树*/
        // 1 递归出口
        if(root == null) {
            return;
        }

        // 2 前序遍历打印（左根右）
        inorderTraversal(root.left);
        System.out.print(root.val + " ");
        inorderTraversal(root.right);
    }

    public void postorderTraversal(TreeNode root) {
        /**
         * 后序遍历二叉树*/
        // 1 递归出口
        if(root == null) {
            return;
        }

        // 2 前序遍历打印（左右根）
        postorderTraversal(root.left);
        postorderTraversal(root.right);
        System.out.print(root.val + " ");
    }
}
